package com.soft2018;

public class Main {

    public static void main(String[] args) {
	// write your code here
        //仅用基类写一个宠物
        Pet p1 = new Pet("旺财",12,"黄色","土狗");
        Pet p2 = new Pet("旺财",12,"黄色","土狗");



        p1.print();

        //定义一个猫对象
        Cat c1 = new Cat("加菲",45,"橘色",4);
        c1.print();
        //c1.catch_mouse();

        //Pet p2 = c1;


        //多态实例
        //新建一个2元素pet 数组

        Pet[] pets = new Pet[2];

        //第一个项是基类Pet 的对象p1;
        pets[0] = p1;
        //第二项是子类 Cat 的对象 c1;
        // cat is a pet
        pets[1] = c1;

        System.out.println();
        //用 foreach 遍历 pets 数组，
        // 打印每个对象的信息
        for (Pet p:pets)
        {
            //多态
            p.print();
        }

        //强制类型转换
        //一般用于拆包
        //封包：将子类对象赋值给父类对象来使用
        //拆包：将父类对象转换为子类对象来使用（可能失败）
        //一般严谨的写法，拆包前，要做类型验证
        if(pets[1] instanceof Cat)
        {
            ((Cat) pets[1]).catch_mouse();
        }

        double a = 2.5;
        int b = (int) a;

        if(pets[0]==p1)
        {
            System.out.println("Pet[0] == p1");
        }
        else {
            System.out.println("Pet[0] != p1");
        }

        if(pets[0].equals(p1))
        {
            System.out.println("pets[0].equals(p1)");
        }
        else {
            System.out.println("pets[0].equals(p1) 错误！");
        }

        if(p2==p1)
        {
            System.out.println("p2 == p1");
        }
        else {
            System.out.println("p2 != p1");
        }

        p2.print();

        System.out.println(p1.toString());
        System.out.println(p2.toString());
        for(Pet p:pets)
        {
            System.out.println(p.toString());
        }

        //对象名，只定义，不进行 new 关键字调用构造函数，则为null
        //并不会对对象名分配内存空间
        //其中没有值，称为 null "空"
        Pet p3;

    }
}
